﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//int main()
//{
	//int name1[10];//整型数组
	//char name2[10];//字符数组
	//double name3[10];//双精度浮点数数组
	
	//int name1[3] = { 1,2,3 };//完全初始化
	//int name2[3] = { 1,2 };//不完全初始化
	////int name3[3] = { 1,2,3，4 };//错误的初始化
	//double name4[3] = { 1.1,1.22,1.3 };
	//printf("%lf", name4[2]);
	//char name5[3] = "good";//常量值为3，这条代码不报错，但只读取goo
	//printf("%c", name5[2]);
	//char name6[3] = { 'g','o','o' };//完全初始化
	//printf("%c", name6[2]);
    //int name7[] = { 1,2,3,4,5,6 };//初始化后可以忽略常量值的输入

	//int name[10] = { 1,2,3,4,5,6,7,8,9,10 };
// 整型 数组名 数组大小
	//        下标： 0，1，2，3，4，5，6，7，8，9
	
	/*int name[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d", name[3]);*///访问数字4

	//int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	////for 循环
	///*int i = 0;
	//for (i = 0; i < 10; i++)
	//{
	//	printf("%d ", a[i]);
	//}*/

	////while循环
	//int i = 0;
	//while (i <= 9)
	//{
	//	printf("%d ", a[i]);
	//	i++;
	//}


	//倒着数
	//int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	////for 循环
	//int i = 9;
	//for (i = 9; i >= 0; i--)
	//{
	//	printf("%d ", a[i]);
	//}

	//while循环
	/*int i = 9;
	while (i >= 0)
	{
		printf("%d ", a[i]);
		i--;
	}
	return 0;*/
//int main()
//{
//	int b[5] = { 1,2,3,4,5 };
//	int i = 0;
//	
//	for (i = 0; i < 5; i++)
//		scanf("%d", &b[i]);
//	
//	for (i = 0; i < 5; i++)
//		printf("%d\n", b[i]);
//
//	
//	return 0;
//}

//int main()
//{
//	int c[2] = { 0 };
//	int i = 0;
//	
//	for (i = 0; i < 2; i++)
//		printf("&c[%d]=%p\n", i, &c[i]);
//
//	return 0;
//}

//int main()
//{
//	int a[10] = { 1,2,3 };
//	int i = 0;
//	printf("%d ", sizeof(a));//计算数组所占内存空间的总大小：40字节
//	printf("%d ", sizeof(int[10])); // 输出 40
//	printf("%d ", sizeof(a[0]));//4
//	printf("%zu ", sizeof(a) / sizeof(a[0]));//计算元素数量:10
//	int b = sizeof(a) / sizeof(a[0]);
//	for (i = 0; i < b; i++)//打印出数组内的内容
//		printf("%d ", a[i]);
//	return 0;
//}

//int main()
//{
//	
//	//int a1[2][2] = { 1,2 };//不完全初始化
//	//int a2[2][2] = { 0 };
//	//int a3[3][3] = { 1,2,3,4,5,6,7,8,9 };
//	//int a4[3][3] = { {1,2},{3,4},{5,6} };
//
//	int a1[][2] = { 1,2 };
//	int a2[][2] = { 0 };
//	int a3[][3] = { 1,2,3,4,5,6,7,8,9 };
//	int a4[][3] = { {1,2},{3,4},{5,6} };
//	return 0;
//}

//int main()
//{
//	int a[3][5] = { 1,2,3,4,5,6,7,8,9,0,2,3,4,5 };
//	printf("%d ", a[2][2]);
//	return 0;
//}


//int main()
//{
//	int arr[3][5] = { 0 };
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			scanf("%d", &arr[i][j]);
//		}
//	}
//
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

//int main()
//{
//	int a[2][6] = { 0 };
//	int b = 0;
//	for (b = 0; b < 2; b++)
//	{
//		int c = 0;
//		for (c = 0; c < 6; c++)
//		{
//			scanf("%d", &a[b][c]);
//		}
//	}
//	for (b = 0; b < 2; b++)
//	{
//		int c = 0;
//		for (c = 0; c < 6; c++)
//		{
//			printf("%d ", a[b][c]);
//		}
//	}
//	return 0;
//}
//
//int main()
//{
//	int a[2][6] = { 0 };
//	int b = 0;
//	int c = 0;
//	for (b = 0; b < 2; b++)
//	{
//		for (c = 0; c < 6; c++)
//		{
//			scanf("%d", &a[b][c]);
//		}
//	}
//	for (b = 0; b < 2; b++)
//	{
//		for (c = 0; c < 6; c++)
//		{
//			printf("%d ", a[b][c]);
//		}
//	}
//	return 0;
//}

//int main()
//{
//	int arr[3][5] = { 0 };
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
//		}
//	}
//	return 0;
//}

//int main()
//{
//	int arr1[10];
//	int arr2[3][n];//?
//	int n = 10;
//	int arr3[n];//?
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	int b[a];
//	int j = 0;
//	for (j = 0; j < a; j++)
//	{
//		b[j] = j;
//	}
//	for (j = 0; j < a; j++)
//	{
//		printf("%d ", b[j]);
//	}
//	return 0;
//}

//练习：
// w e l c o m e  t o  m y  c h a n n e l .
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
//left                                right
//welcome to my channel.
//**********************
// <string.h>
//strlen，求字符串长度，包含\0
//<windows.h>
//sleep();


//#include <string.h>
//#include <windows.h>
//#include <stdlib.h>
//int main()
//{
//
//	char a1[] = "welcome to my channel.";//char类型，每个元素一字节
//	char a2[] = "**********************";
//
//	int left = 0;
//	int right = sizeof(a1) / sizeof(a1[0]) - 2;
//	//int right = strlen(a1) - 1;//21
//	//有效字符数(单纯的字符数量)为22（不包含\0）
//	//数组总长度（加上\0）为23（下标0~22）
//	//最后一个元素下标为21
//	//sizeof(a1)/sizeof(a1[0]) -1(跳过 \0)-1(将元素数转换为下标)
//	
//	while (left <= right)
//	{
//		a2[left]= a1[left];
//		a2[right]= a1[right];
//		printf("%s\n", a2);
//		
//		//反着来
//		/*a1[left] = a2[left];
//		a1[right] = a2[right];
//		printf("%s\n", a1);*/
//		
//		Sleep(1000);//睡眠函数，1000毫秒
//		system("cls");//清理屏幕信息
//		left++;
//		right--;
//	}
//	printf("%s\n", a2);
//	return 0;
//}



//给定⼀个升序的整型数组，在这个数组中查找到指定的值n，
// 找到了就打印n的下标，找不到就打印："找不到"。

//暴力方法1，2，3：
//方法一
//int main()
//{
//	int a[] = { 1,2,3,4,5,6,7,8,9 };
//	int n = 2;
//	int i = 0;
//	//遍历后再比较
//	int b = sizeof(a) / sizeof(a[0]);
//	for (i = 0; i < b; i++)
//	{
//		if (n == a[i])
//		{
//			printf("找到了，下标为%d", i);
//			break;
//		}
//	}
//	if (i == b)//遍历之后找不到，那么i会==10
//		printf("找不到");
//	return 0;
//}


//方法二：
//int main()
//{
//	int a[] = { 1,2,3,4,5,6,7,8,9 };
//	int n = 2;
//	int i = 0;
//	//遍历后再比较
//	int b = sizeof(a) / sizeof(a[0]);
//	int find = 0;//假设没找到
//	for (i = 0; i < b; i++)
//	{
//		if (n == a[i])
//		{
//			find = 1;


////当元素 n 被找到时，find 被赋值为 1。
////循环结束后，find == 0 的条件为假
////不会执行 printf("找不到")，因此只输出正确结果。
////find == 1 是一个逻辑判断（比较），而非赋值操作。
////即使找到元素,find的值仍保持初始值 0。
////循环结束后，find == 0 的条件为真，导致 同时输出两段内容。


//			printf("找到了，下标为%d", i);
//			break;
//		}
//	}
//	if (find == 0)//遍历之后找不到，那么i会==10
//		printf("找不到");
//	return 0;
//}


//方法三
#include<stdbool.h>
//int main()
//{
//	int a[] = { 1,2,3,4,5,6,7,8,9 };
//	int n = 2;
//	int i = 0;
//	//遍历后再比较
//	int b = sizeof(a) / sizeof(a[0]);
//	bool find = false;//假设没找到
//	for (i = 0; i < b; i++)
//	{
//		if (n == a[i])
//		{
//			find = true;
//			printf("找到了，下标为%d", i);
//			break;
//		}
//	}
//	if (!find)
//		printf("找不到");
//	return 0;
//}

//非暴力（折半查找）：
int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,9,10 };
	int n = 11;
	int left = 0;
	int right = sizeof(a) / sizeof(a[0]) - 1;//求下标
	bool find = false;
	while (left <= right)
	{
		int mid = (left + right) / 2;//中间元素的下标
		if (a[mid] < n)//下标所定的元素
			left = mid + 1;
		else if (a[mid] > n)
			right = mid - 1;
		else
		{
			printf("找到了,下标是%d", mid);
			find = true;
			break;
		}
	}
	if (find == false)
		printf("找不到");
	return 0;
}